1. Базовый функционал на cmake - час-полнтора скелет набросать: https://cmake.org/cmake-tutorial/ ﻿Но, если мне не изменяет память, то на виртуалке можно поиметь админские права - удаляйте cmake, вместо него создавайте скрипт-заглушку, который выполняется и ничего не делает, а сборку пишите в простом Makefile :-)
﻿2. getopt  вообще крайне полезная штука, если аргументов у программы больше двух, для базового понимания  - 30 минут и чтение примера из мануала: https://manned.org/getopt.3. С другой стороны - это рекомендация, можете сделать разбор сами.
3. Демонизация - просто трюк с форком. Гуглится по словам C++ daemonization﻿
4. Парсер HTTP возьмите этот: https://github.com/nodejs/http-parser будет экономия времени на разборе.



1. TCP-сервер с использованием libevent, libev, libuv или Asio - это задание в курсе уже было
2. Сделайте его многопоточным/многопроцессным. libevent настойчиво рекомендует один цикл на процесс и избегать потоков, libuv - вроде как тоже (мы с ним не нашли общего языка). libev позволяет указать колбеки и более безопасно работать с многопоточном окружении, хотя больше склоняется к многопроцессному подходу. Asio больше рассчитан на работу в многопоточном окружении. У каждого подхода есть свои плюсы и минусы. Я влюбился в libev и использую его в многопоточном окружении, тем паче, что автор очень отзывчивый. Что-то не припомню, что этот нюанс освещался (лекции не смотрел), но документация тут поможет. По мне, так на этом шаге нужно хорошее знание языка, что бы не наделать детских ошибок, иначе можно закопаться.
3. Теперь добавьте сюда не просто вычитку данных из сокета, но их обработку. В данном случае - парсинг HTTP (либу я дал выше, она под лицензией BSD).
3.1. К обработке: из запроса потребуется читать файл на диске, если запрошенного файла нет (допустим open() вернёт -1), то возвращать 404, если найден - читать файл (а можно мапить в память и отправлять в сокет этот буфер или использовать sendfile), отправлять ответ 200 и содержимое файла. Сама спека протокола HTTP (особенно в виде 1.0) достаточно простая, документации из Wikipedia вам хватит: https://ru.wikipedia.org/wiki/HTTP
4. Теперь можно сделать обработку опций командной строки. Параметры, которые они будут задавать, лучше вынести раньше в отдельные переменные, тогда добавление обработки сведётся только к установке их новых значений и на другие части программы не повлияет (в части изменения кода, а не логики).
5. Теперь можно добавить демонизацию. Как я писал выше - это трюк с fork. Ищется легко. на CCAN есть даже готовая мини-либа: http://ccodearchive.net/info/daemonize.html или ?http://ccodearchive.net/info/daemon_with_notify.html?
6. А вот теперь можно завернуть с сборку и конфигурирование при помощи cmake, я вам гарантирую он будет не больше 10 строчек. Хотя этот пункт можно и сделать нулевым: я пишу в Qt Creator с моим плагином CMakeProjectManager2 - он сам костяк проекта делает, но бинарные сборки есть только для Ubuntu 14.04/Linux mint 17 в PPA, хотя можно воспользоваться стандартным плагином, но там чуточку возможностей меньше. CLion так вообще CMake использует как стандартный формат своего проекта. KDevelop - тоже.
7. Теперь добавить систему версифицирования GIT. Хотя этот пункт я бы вообще сделал -1 :) Потом залить на GitHub, вот инструкция для самых маленьких: https://guides.github.com/activities/hello-world/ и https://guides.github.com/introduction/getting-your-project-on-github/
8. Тестирование и доработка, а так же другие пункты, которые я забыл.

